home *** CD-ROM | disk | FTP | other *** search
/ Java Programmer's Toolkit / Java Programmer's Toolkit.iso / gsview / src / winsetup.c < prev    next >
C/C++ Source or Header  |  1996-01-02  |  21KB  |  767 lines

  1. /* Copyright (C) 1993-1996, Russell Lang.  All rights reserved.;
  2.   
  3.   This file is part of GSview.
  4.   
  5.   This program is distributed with NO WARRANTY OF ANY KIND.  No author
  6.   or distributor accepts any responsibility for the consequences of using it,
  7.   or for whether it serves any particular purpose or works at all, unless he
  8.   or she says so in writing.  Refer to the GSview Free Public Licence 
  9.   (the "Licence") for full details.
  10.   
  11.   Every copy of GSview must include a copy of the Licence, normally in a 
  12.   plain ASCII text file named LICENCE.  The Licence grants you the right 
  13.   to copy, modify and redistribute GSview, but only under certain conditions 
  14.   described in the Licence.  Among other things, the Licence requires that 
  15.   the copyright notice and this notice be preserved on all copies.
  16. */
  17.  
  18. /* winsetup.c */
  19. /* MS-Windows installation program for GSview and Ghostscript */
  20. /* rjl 1996-01-02 */
  21.  
  22. #define STRICT
  23. #include <windows.h>
  24. #include <windowsx.h>
  25. #include <ddeml.h>
  26. #include <shellapi.h>
  27. #include <stdio.h>
  28. #include <stdlib.h>
  29. #include <string.h>
  30. #include <dir.h>
  31. #include <ctype.h>
  32. #include <io.h>
  33.  
  34. #define MAXSTR 256
  35.  
  36. #include "setup.h"
  37. #include "gvcrc.h"
  38.  
  39. #define BASEDIR "\\gs3.53"
  40. #define UNZIPEXE "winunzip.exe"
  41. #define GSVIEWZIP "gsview.zip"
  42. #define GSINIZIP  "gs353ini.zip"
  43. #define GSW32ZIP  "gs353w32.zip"
  44. #define GSWINZIP  "gs353win.zip"
  45. #define GSFNTZIP  "gs353fn1.zip"
  46.  
  47. BOOL CALLBACK _export GeneralDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  48. BOOL CALLBACK _export InputDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  49. BOOL CALLBACK _export ModelessDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam);
  50.  
  51. char workdir[MAXSTR];
  52. char bootdrive[MAXSTR];
  53. char sourcedir[MAXSTR];
  54. char destdir[MAXSTR];
  55. char unzipname[MAXSTR];
  56. char winsetup[MAXSTR];
  57. char includepath[MAXSTR];
  58. HINSTANCE phInstance;
  59. char get_string_answer[MAXSTR];
  60. char szAppName[]="GSview Install";
  61. char szIniName16[]="gsview.ini";
  62. char szIniName32[]="gsview32.ini";
  63. char error_message[MAXSTR];
  64. char no_error[] = "";
  65. int atm_present;
  66. int atm_fonts;
  67. char atm_dir[MAXSTR];
  68. int use_atm_fonts;
  69. int is_win32;
  70.  
  71. #define DID_OK IDOK
  72. #define DID_CANCEL IDCANCEL
  73. #define MBID_YES IDYES
  74. #define MBID_NO IDNO
  75. #define MB_MOVEABLE 0
  76.  
  77. int
  78. dialog(int resource, DLGPROC dlgproc) 
  79. {
  80. int flag;
  81. #ifndef __WIN32__
  82. DLGPROC lpProcDlg;
  83. #endif
  84. #ifdef __WIN32__
  85.     flag = DialogBoxParam( phInstance, MAKEINTRESOURCE(resource), HWND_DESKTOP, dlgproc, (LPARAM)NULL);
  86. #else
  87.     lpProcDlg = (DLGPROC)MakeProcInstance((FARPROC)dlgproc, phInstance);
  88.     flag = DialogBoxParam( phInstance, MAKEINTRESOURCE(resource), HWND_DESKTOP, lpProcDlg, (LPARAM)NULL);
  89.     FreeProcInstance((FARPROC)lpProcDlg);
  90. #endif
  91.     return flag;
  92. }
  93.  
  94. int message_box(char *str, int icon)
  95. {
  96.     return MessageBox(HWND_DESKTOP, str, szAppName, icon);
  97. }
  98.  
  99. /* change directory and drive */
  100. int
  101. _chdir2(char *dirname)
  102. {
  103. #ifdef __WIN32__
  104.     SetCurrentDirectory(dirname);
  105. #else
  106.     if (isalpha(dirname[0]) && (dirname[1]==':'))
  107.         (void) setdisk(toupper(dirname[0])-'A');
  108.     if (!((strlen(dirname)==2) && isalpha(dirname[0]) && (dirname[1]==':')))
  109.         chdir(dirname);
  110. #endif
  111.     return 0;
  112. }
  113.  
  114. int copyfile(char *dname, char *sname)
  115. {
  116. FILE *dfile, *sfile;
  117. char *buffer;
  118. int count;
  119. #define COPY_BUF_SIZE 16384
  120.     sfile = fopen(sname, "rb");
  121.     if (sfile == (FILE *)NULL) {
  122.     sprintf(error_message, "Can't open %s for reading", sname);
  123.     return 1;
  124.     }
  125.     dfile = fopen(dname, "wb");
  126.     if (dfile == (FILE *)NULL) {
  127.     sprintf(error_message, "Can't open %s for writing", dname);
  128.     fclose(sfile);
  129.     return 1;
  130.     }
  131.     if ( (buffer = malloc(COPY_BUF_SIZE)) == (char *)NULL ) {
  132.     fclose(sfile);
  133.     fclose(dfile);
  134.     sprintf(error_message, "Can't allocate memory for copy buffer");
  135.     return 1;
  136.     }
  137.  
  138.     while ( (count = fread(buffer, 1, COPY_BUF_SIZE, sfile)) != 0 )
  139.     fwrite(buffer, 1, count, dfile);
  140.  
  141.     free(buffer);
  142.     fclose(dfile);
  143.     fclose(sfile);
  144.     return 0;
  145. }
  146.  
  147. int
  148. intro(void)
  149. {
  150. int flag;
  151.     /* Introduction */
  152.     if (dialog(IDD_INTRO, GeneralDlgProc) != DID_OK) {
  153.     strcpy(error_message, no_error);
  154.     return 1;
  155.     }
  156.  
  157.     /* Copyright */
  158.     if (dialog(IDD_COPYRIGHT, GeneralDlgProc) != DID_OK) {
  159.     strcpy(error_message, no_error);
  160.     return 1;
  161.     }
  162.  
  163.     return 0; /* success */
  164. }
  165.  
  166. int
  167. getdest(void)
  168. {
  169. int valid;
  170. int i;
  171.     valid = 0;
  172.     while (!valid) {
  173.         /* Destination directory */
  174.         strcpy(get_string_answer, bootdrive);
  175.         strcat(get_string_answer,"\\"); 
  176.         if (dialog(IDD_DIR, InputDlgProc) != DID_OK) {
  177.         strcpy(error_message, no_error);
  178.         return 1;
  179.     }
  180.         strcpy(destdir, get_string_answer);
  181.         if (_chdir2(destdir))
  182.         message_box("Directory does not exist.  Please enter a directory name that does exist.",
  183.          MB_MOVEABLE | MB_OK);
  184.     else
  185.         valid = 1;
  186.     _chdir2(workdir);
  187.     }
  188.     /* remove trailing \ from destination directory */
  189.     i = strlen(destdir) - 1;
  190.     if ( (i >= 0) && (destdir[i] == '\\') )
  191.     destdir[i] = '\0';
  192.     return 0;
  193. }
  194.  
  195.  
  196.  
  197. int
  198. cleanup(void)
  199. {
  200.     return 0;
  201. }
  202.  
  203.  
  204. int
  205. unzip(char *filename, char *destination)
  206. {
  207.     /* start unzip session */  
  208.     char fullname[256];
  209.     char arg[256];
  210.     FILE *f;
  211.     int file_exists = 0;
  212.     HMODULE hmodule;
  213.     MSG msg;
  214. #ifndef __WIN32__
  215.     DLGPROC lpUnzipDlgProc;
  216. #endif
  217.     int abort = 0;
  218.     HWND hDlgModeless;
  219.  
  220.     /* prompt for disk to be installed */
  221.     strcpy(fullname, sourcedir);
  222.     strcat(fullname, filename);
  223.     while (!file_exists) {
  224.         if ( (f = fopen(fullname, "r")) == (FILE *)NULL ) {
  225.         char buf[256];
  226.         sprintf(buf, "Insert disk containing %s", fullname);
  227.         strcpy(get_string_answer, fullname);
  228.         if (dialog(IDD_FILE, InputDlgProc) != DID_OK) {
  229.         strcpy(error_message, no_error);
  230.         return 1;
  231.         }
  232.         strcpy(fullname, get_string_answer);
  233.     }
  234.     else {
  235.         file_exists = TRUE;
  236.         fclose(f);
  237.     }
  238.     }
  239.  
  240.     /* set up unzip arguments */
  241.     sprintf(arg, "%s -o %s -d %s%s", unzipname, fullname, destination,
  242.     (strlen(destination) == 2) ? "\\" : "");
  243.  
  244.     hmodule = (HMODULE)WinExec(arg, SW_SHOWNOACTIVATE);
  245.  
  246.     if (hmodule == (HMODULE)NULL) {
  247.     sprintf(error_message, "Can't run %s", arg);
  248.     return 1;
  249.     }
  250.  
  251.  
  252. #ifdef __WIN32__
  253.     hDlgModeless = CreateDialogParam(phInstance, MAKEINTRESOURCE(IDD_UNZIP), HWND_DESKTOP, ModelessDlgProc, (LPARAM)NULL);
  254. #else
  255.     lpUnzipDlgProc = (DLGPROC)MakeProcInstance((FARPROC)ModelessDlgProc, phInstance);
  256.     hDlgModeless = CreateDialogParam(phInstance, MAKEINTRESOURCE(IDD_UNZIP), HWND_DESKTOP, lpUnzipDlgProc, (LPARAM)NULL);
  257. #endif
  258.     while (IsWindow(hDlgModeless) && GetModuleUsage(hmodule)) {
  259.         while (PeekMessage(&msg, (HWND)NULL, 0, 0, PM_REMOVE)) {
  260.         if ((hDlgModeless==0) || !IsDialogMessage(hDlgModeless, &msg)) {
  261.             TranslateMessage(&msg);
  262.             DispatchMessage(&msg);
  263.         }
  264.     }
  265.     }
  266.  
  267.     /* display cancel dialog */
  268.     if (!IsWindow(hDlgModeless))
  269.     abort = TRUE;
  270.     else
  271.     DestroyWindow(hDlgModeless);
  272.  
  273. #ifndef __WIN32__
  274.     FreeProcInstance((FARPROC)lpUnzipDlgProc);
  275. #endif
  276.  
  277.     if (abort) {
  278.     strcpy(error_message, "Unzip cancelled");
  279.     return 1;
  280.     }
  281.     return 0;
  282. }
  283.  
  284. int
  285. update_config(void)
  286. {
  287. FILE *infile, *outfile;
  288. char inname[MAXSTR], outname[MAXSTR];
  289. char line[1024];
  290. char tempname[MAXSTR];
  291. char buf[MAXSTR];
  292. int replace = 0;
  293.     
  294.     if (getenv("TEMP"))
  295.     return 0;    /* assume TEMP is in autoexec.bat */
  296.  
  297.     strcpy(inname, bootdrive);
  298.     strcat(inname, "\\autoexec.bat");
  299.  
  300.     replace = (dialog(IDD_CONFIG, GeneralDlgProc) == DID_OK);
  301.  
  302.     strcpy(tempname, bootdrive);
  303.     strcat(tempname, "\\GSXXXXXX");
  304.     if (mktemp(tempname) == (char *)NULL) {
  305.         strcpy(error_message, "Can't get temporary filename");
  306.         return 1;
  307.     }
  308.  
  309.     if ( (infile = fopen(inname, "r")) == (FILE *)NULL) {
  310.     sprintf(error_message, "Can't open %s for reading", inname);
  311.     return 1;
  312.     }
  313.     if ( (outfile = fopen(tempname, "w")) == (FILE *)NULL)  {
  314.     sprintf(error_message, "Can't create %s for writing", outname);
  315.     return 1;
  316.     }
  317.     while (fgets(line, sizeof(line), infile)) {
  318.     fputs(line, outfile);
  319.     }
  320.     sprintf(line, "SET TEMP=%s\\\n", bootdrive);
  321.     fputs(line, outfile);
  322.  
  323.     fclose(outfile);
  324.     fclose(infile);
  325.  
  326.     strcpy(outname, bootdrive);
  327.     strcat(outname, "\\autoexec.gs");
  328.     if ( (outfile = fopen(outname, "r")) != (FILE *)NULL)  {
  329.     fclose(outfile);
  330.     sprintf(buf, "File %s exists.  Overwrite?", outname);
  331.     if (message_box(buf, MB_YESNO) != MBID_YES) {
  332.         return 0;
  333.     }
  334.     unlink(outname);
  335.     }
  336.     if (replace) {
  337.     /* modify autoexec.bat */
  338.     if (rename(inname, outname)) {
  339.         sprintf(error_message, "Error renaming %s to %s", inname, outname);
  340.         return 1;
  341.     }
  342.     if (rename(tempname, inname)) {
  343.         sprintf(error_message, "Error renaming %s to %s", tempname, inname);
  344.         return 1;
  345.     }
  346.     }
  347.     else {
  348.     if (rename(tempname, outname)) {
  349.         sprintf(error_message, "Error renaming %s to %s", tempname, outname);
  350.         return 1;
  351.     }
  352.     sprintf(buf, "Changes were saved in %s", outname);
  353.     message_box(buf, MB_MOVEABLE | MB_OK);
  354.     }
  355.  
  356.     return 0;
  357. }
  358.  
  359. int
  360. update_fontmap(void)
  361. {
  362. char fontmap[MAXSTR];
  363. char fontmap_atm[MAXSTR];
  364. char fontmap_old[MAXSTR];
  365. char buf[MAXSTR];
  366. FILE *f, *infile;
  367. int backup = 1;
  368.     if (atm_present) {
  369.       if (dialog(IDD_ATM, GeneralDlgProc) != DID_OK)
  370.     return 0;
  371.     }
  372.     else
  373.     return 0;
  374.  
  375.     use_atm_fonts = TRUE;
  376.  
  377.     strcpy(fontmap, destdir);
  378.     strcat(fontmap, BASEDIR);
  379.     strcpy(fontmap_atm, fontmap);
  380.     strcpy(fontmap_old, fontmap);
  381.     strcat(fontmap, "\\Fontmap");
  382.     if (atm_fonts > 13)
  383.        strcat(fontmap_atm, "\\Fontmap.ATB");
  384.     else
  385.        strcat(fontmap_atm, "\\Fontmap.ATM");
  386.     strcat(fontmap_old, "\\Fontmap.old");
  387.     if ( (f = fopen(fontmap_old, "r")) != (FILE *)NULL)  {
  388.     fclose(f);
  389.     sprintf(buf, "File %s exists.  Overwrite?", fontmap_old);
  390.     if (message_box(buf, MB_MOVEABLE | MB_YESNO) != MBID_YES) {
  391.         backup = 0;
  392.     }
  393.     }
  394.     if (backup) {
  395.     unlink(fontmap_old);
  396.         if (rename(fontmap, fontmap_old)) {
  397.         sprintf(error_message, "Error renaming %s to %s", fontmap, fontmap_old);
  398.         return 1;
  399.     }
  400.     }
  401.  
  402.     infile = fopen(fontmap_atm, "r");
  403.     if (infile == (FILE *)NULL) {
  404.     sprintf(error_message, "Can't open %s for reading", fontmap_atm);
  405.     return 1;
  406.     }
  407.     f = fopen(fontmap, "w");
  408.     if (f == (FILE *)NULL) {
  409.     sprintf(error_message, "Can't create %s for writing", fontmap);
  410.     fclose(infile);
  411.     return 1;
  412.     }
  413.     while (fgets(buf, sizeof(buf), infile))
  414.     fputs(buf, f);
  415.     fclose(infile);
  416.     fclose(f);
  417.     return 0;
  418. }
  419.  
  420. int
  421. update_ini(void)
  422. {
  423. char dest[MAXSTR];
  424. char buf[MAXSTR];
  425.  
  426.     strcpy(dest, destdir);
  427.     strcat(dest, BASEDIR);
  428.     strcpy(buf, dest);
  429.     strcat(buf, "\\gswin.exe");
  430.     WritePrivateProfileString("Options", "GhostscriptExe", buf, szIniName16);
  431.     strcpy(buf, dest);
  432.     strcat(buf, "\\gswin32.exe");
  433.     WritePrivateProfileString("Options", "GhostscriptExe", buf, szIniName32);
  434.  
  435.     strcpy(includepath, dest);
  436.     strcat(includepath, ";");
  437.     strcat(includepath, dest);
  438.     strcat(includepath, "\\fonts");
  439.     if (use_atm_fonts) {
  440.         strcat(includepath, ";");
  441.     strcat(includepath, atm_dir);
  442.     }
  443.     WritePrivateProfileString("Options", "GhostscriptInclude", includepath, szIniName16);
  444.     WritePrivateProfileString("Options", "GhostscriptInclude", includepath, szIniName32);
  445.     WritePrivateProfileString("Options", "GhostscriptVersion", "351", szIniName16);
  446.     WritePrivateProfileString("Options", "GhostscriptVersion", "351", szIniName32);
  447.     WritePrivateProfileString("Options", "Version", GSVIEW_VERSION, szIniName16);
  448.     WritePrivateProfileString("Options", "Version", GSVIEW_VERSION, szIniName32);
  449.     return 0;
  450. }
  451.  
  452. #pragma argsused    /* ignore warning for next function */
  453. HDDEDATA CALLBACK 
  454. DdeCallback(UINT type, UINT fmt, HCONV hconv,
  455.     HSZ hsz1, HSZ hsz2, HDDEDATA hData, DWORD dwData1, DWORD dwData2)
  456. {
  457.   switch (type) {
  458.     default:
  459.     return (HDDEDATA)NULL;
  460.   }
  461. }
  462.  
  463. int
  464. create_object(void)
  465. {
  466. char buf[MAXSTR];
  467. DWORD idInst = 0L;
  468. FARPROC lpDdeProc;
  469. HSZ hszServName;
  470. HSZ hszSysTopic;
  471. HCONV hConv;
  472. HDDEDATA hData;
  473. char setup[MAXSTR+MAXSTR];
  474. DWORD dwResult;
  475.  
  476.     lpDdeProc = MakeProcInstance((FARPROC)DdeCallback, phInstance);
  477.     if (DdeInitialize(&idInst, (PFNCALLBACK)lpDdeProc, CBF_FAIL_POKES, 0L)) {
  478.     FreeProcInstance(lpDdeProc);
  479.     return 1;
  480.     }
  481.     hszServName = DdeCreateStringHandle(idInst, "PROGMAN", CP_WINANSI);
  482.     hszSysTopic = DdeCreateStringHandle(idInst, "PROGMAN", CP_WINANSI);
  483.     hConv = DdeConnect(idInst, hszServName, hszSysTopic, (PCONVCONTEXT)NULL);
  484.     if (hConv == NULL) {
  485.     message_box("Couldn't open DDE connection to Program Manger\n", 0);
  486.     return 1;
  487.     }
  488.  
  489. #define DDEEXECUTE(str)\
  490.     DdeClientTransaction((LPBYTE)str, strlen(str)+1, hConv,\
  491.     NULL, CF_TEXT, XTYP_EXECUTE, 2000, &dwResult)
  492.  
  493.     sprintf(setup, "[CreateGroup(\042GS Tools\042,gstools.grp)][ShowGroup(\042GS Tools\042,1)]");
  494.     DDEEXECUTE(setup);
  495.     sprintf(setup, "[ReplaceItem(\042GSview\042)]");
  496.     DDEEXECUTE(setup);
  497.     sprintf(setup, "[AddItem(\042%s\\gsview\\gsview.exe\042,\042GSview\042)]", destdir);
  498.     DDEEXECUTE(setup);
  499.     sprintf(setup, "[ReplaceItem(\042GSview 32\042)]");
  500.     DDEEXECUTE(setup);
  501.     sprintf(setup, "[AddItem(\042%s\\gsview\\gsview32.exe\042,\042GSview 32\042,\042%s\\gsview\\gsview.exe\042)]", destdir, destdir);
  502.     DDEEXECUTE(setup);
  503.     sprintf(setup, "[ReplaceItem(\042GSview README\042)]");
  504.     DDEEXECUTE(setup);
  505.     sprintf(setup, "[AddItem(\042notepad.exe %s\\gsview\\README.GV\042,\042GSview README\042)]", destdir, BASEDIR);
  506.     DDEEXECUTE(setup);
  507.     sprintf(setup, "[ReplaceItem(\042Ghostscript\042)]");
  508.     DDEEXECUTE(setup);
  509.     sprintf(setup, "[AddItem(\042%s%s\\gswin.exe -I%s\042,\042Ghostscript\042)]", destdir, BASEDIR, includepath);
  510.     DDEEXECUTE(setup);
  511.     sprintf(setup, "[ReplaceItem(\042Ghostscript 32\042)]");
  512.     DDEEXECUTE(setup);
  513.     sprintf(setup, "[AddItem(\042%s%s\\gswin32.exe -I%s\042,\042Ghostscript 32\042,\042%s%s\\gswin.exe\042)]", destdir, BASEDIR, includepath, destdir, BASEDIR);
  514.     DDEEXECUTE(setup);
  515.     sprintf(setup, "[ReplaceItem(\042Ghostscript README\042)]");
  516.     DDEEXECUTE(setup);
  517.     sprintf(setup, "[AddItem(\042notepad.exe %s%s\\README.\042,\042Ghostscript README\042)]", destdir, BASEDIR);
  518.     DDEEXECUTE(setup);
  519. #undef DDEXECUTE
  520.  
  521.     DdeDisconnect(hConv);
  522.     DdeUninitialize(idInst);
  523.  
  524.  
  525.     return 0;
  526. }
  527.  
  528. int
  529. update_registry(void)
  530. {
  531. HKEY hkey;
  532. char buf[MAXSTR];
  533. char *psname="psfile";
  534. char *psvalue="PostScript";
  535. LONG rc;
  536.  
  537.     rc = RegSetValue(HKEY_CLASSES_ROOT, psname, REG_SZ, psvalue, strlen(psvalue));
  538.     if (rc == ERROR_SUCCESS)
  539.     rc = RegSetValue(HKEY_CLASSES_ROOT, ".ps", REG_SZ, psname, strlen(psname));
  540.     if (rc == ERROR_SUCCESS)
  541.     rc = RegSetValue(HKEY_CLASSES_ROOT, ".eps", REG_SZ, psname, strlen(psname));
  542.  
  543.     if (rc == ERROR_SUCCESS)
  544.     rc = RegCreateKey(HKEY_CLASSES_ROOT, "psfile\\shell\\open", &hkey);
  545.     sprintf(buf, "%s\\gsview\\gsview%s.exe %%1", destdir, (is_win32 ? "32" : ""));
  546.     if (rc == ERROR_SUCCESS)
  547.     rc = RegSetValue(hkey, "command", REG_SZ, buf, strlen(buf));
  548.     RegCloseKey(hkey);
  549.  
  550.     if (rc == ERROR_SUCCESS)
  551.     rc = RegCreateKey(HKEY_CLASSES_ROOT, "psfile\\shell\\print", &hkey);
  552.     sprintf(buf, "%s\\gsview\\gsview%s.exe /p %%1", destdir, (is_win32 ? "32" : ""));
  553.     if (rc == ERROR_SUCCESS)
  554.     rc = RegSetValue(hkey, "command", REG_SZ, buf, strlen(buf));
  555.     RegCloseKey(hkey);
  556.  
  557.     if (rc != ERROR_SUCCESS) {
  558.     strcpy(error_message, "Error while updating registry");
  559.     return 1;
  560.     }
  561.     return 0;
  562. }
  563.  
  564. int
  565. install(void)
  566. {
  567. char buf[MAXSTR];
  568. int rc;
  569. char *p;
  570. HMODULE hmodule;
  571. DWORD version = GetVersion();
  572.  
  573.     /* find out if we are running under Windows 95 or NT */
  574.     if ((LOBYTE(LOWORD(version))<<8) + HIBYTE(LOWORD(version)) > 0x30b)
  575.     is_win32 = TRUE;
  576.  
  577.     /* get path to EXE */
  578.     GetModuleFileName(phInstance, sourcedir, sizeof(sourcedir));
  579.     if ((p = strrchr(sourcedir,'\\')) != (char *)NULL)
  580.     p++;
  581.     else
  582.     p = sourcedir;
  583.     *p = '\0';
  584.  
  585.     /* Inspect system, get boot drive */
  586.     getcwd(workdir, sizeof(workdir));    /* remember the working directory */
  587.     strcpy(bootdrive, "C:");
  588.  
  589.     /* check for active Adobe Type Manager */
  590.     GetPrivateProfileString("Setup", "PFB_Dir", "", atm_dir, sizeof(atm_dir), "atm.ini");
  591.     if (strlen(atm_dir) != 0) {
  592.     atm_present = TRUE;
  593.     atm_fonts = 13;    /* assume 13 base fonts */
  594.     GetPrivateProfileString("fonts", "AvantGarde", "", buf, sizeof(buf), "atm.ini");
  595.     if (strlen(buf) != 0)
  596.         atm_fonts = 39;       /* assume 39 fonts - same as LaserWriter Plus */
  597.     GetPrivateProfileString("fonts", "Tekton", "", buf, sizeof(buf), "atm.ini");
  598.     if (strlen(buf) != 0)
  599.         atm_fonts = 65;       /* assume Adobe Type Basics */
  600.     }
  601.  
  602.     
  603.     if (!rc)
  604.         rc = intro();    /* display intro dialog boxes */
  605.  
  606.     if (!rc)
  607.     rc = getdest();    /* get destination directory */
  608.  
  609.  
  610.     if (!rc) {
  611.     /* copy unzip program for faster loading */
  612.     strcpy(unzipname, destdir);
  613.     strcat(unzipname, "\\gsview");
  614.     mkdir(unzipname);
  615.     strcat(unzipname, "\\");
  616.     strcat(unzipname, UNZIPEXE);
  617.     strcpy(buf, sourcedir);
  618.     strcat(buf, UNZIPEXE);
  619.     rc = copyfile(unzipname, buf);
  620.     }
  621.  
  622.     /* unzip GSview and Ghostscript */
  623.     if (!rc) {
  624.     rc = unzip(GSVIEWZIP, destdir);
  625.     }
  626.     if (!rc)
  627.     rc = unzip(GSINIZIP, destdir);
  628.     if (!rc)
  629.     rc = unzip(GSW32ZIP, destdir);
  630.     if (!rc)
  631.     rc = unzip(GSWINZIP, destdir);
  632.     if (!rc) {
  633.     strcpy(buf, destdir);
  634.     strcat(buf, BASEDIR);
  635.     rc = unzip(GSFNTZIP, buf);
  636.     }
  637.  
  638.     /* remove unneeded unzip */
  639.     unlink(unzipname);
  640.  
  641.     if (!rc) {
  642.     rc = update_config();
  643.     }
  644.  
  645.     if (!rc) {
  646.     rc = update_fontmap();
  647.     }
  648.  
  649.     if (!rc) {
  650.     rc = update_ini();
  651.     }
  652.  
  653.     if (!rc) {
  654.     rc = create_object();
  655.     }
  656.  
  657.     if (!rc)
  658.     rc = update_registry();
  659.  
  660.     if (!rc) {
  661.     sprintf(buf, "Installation successful.\r\
  662. A Program Manager group named \042GS Tools\042 has been created.\r\
  663. File Manager associations have been created for .ps and .eps files.");
  664.     message_box(buf, MB_MOVEABLE | MB_OK);
  665.     }
  666.     return rc;
  667. }
  668.  
  669.  
  670. #pragma argsused    /* ignore warning for next function */
  671. int PASCAL 
  672. WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int cmdShow)
  673. {
  674.     int rc = 0;
  675.     LPSTR p;
  676.     /* copy the hInstance into a variable so it can be used */
  677.     phInstance = hInstance;
  678.  
  679.     rc = install();
  680.  
  681.     if (rc) {
  682.         char buf[256];
  683.     sprintf(buf, "Installation aborted\012%s", error_message);
  684.     message_box(buf, MB_MOVEABLE | MB_OK);
  685.     }
  686.  
  687.     rc = cleanup();
  688.     return rc;
  689. }
  690.  
  691.  
  692. #pragma argsused    /* ignore warning for next function */
  693. /* General Dialog Box */
  694. BOOL CALLBACK _export
  695. GeneralDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  696. {
  697.     switch(message) {
  698.         case WM_INITDIALOG:
  699.             return( TRUE);
  700.         case WM_COMMAND:
  701.             switch(LOWORD(wParam)) {
  702.                 case IDOK:
  703.                     EndDialog(hDlg, IDOK);
  704.                     return(TRUE);
  705.                 case IDCANCEL:
  706.                     EndDialog(hDlg, IDCANCEL);
  707.                     return(TRUE);
  708.                 default:
  709.                     return(FALSE);
  710.             }
  711.     }
  712.     return(FALSE);
  713. }
  714.  
  715. #pragma argsused    /* ignore warning for next function */
  716. /* input string dialog box */
  717. BOOL CALLBACK _export
  718. InputDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  719. {
  720.     switch(message) {
  721.         case WM_INITDIALOG:
  722.         SetDlgItemText(hDlg, ID_ANSWER, get_string_answer);
  723.             return( TRUE);
  724.         case WM_COMMAND:
  725.             switch(LOWORD(wParam)) {
  726.         case IDOK:
  727.             GetDlgItemText(hDlg, ID_ANSWER, get_string_answer, sizeof(get_string_answer));
  728.                     EndDialog(hDlg, IDOK);
  729.                     return(TRUE);
  730.                 case IDCANCEL:
  731.                     EndDialog(hDlg, IDCANCEL);
  732.                     return(TRUE);
  733.                 default:
  734.                     return(FALSE);
  735.             }
  736.     }
  737.     return(FALSE);
  738. }
  739.  
  740.  
  741. #pragma argsused    /* ignore warning for next function */
  742. /* Modeless Dialog Box */
  743. BOOL CALLBACK _export
  744. ModelessDlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
  745. {
  746.     switch(message) {
  747.         case WM_INITDIALOG:
  748.             return( TRUE);
  749.         case WM_COMMAND:
  750.             switch(LOWORD(wParam)) {
  751.                 case IDOK:
  752.             DestroyWindow(hDlg);
  753.                     return(TRUE);
  754.                 case IDCANCEL:
  755.             DestroyWindow(hDlg);
  756.                     return(TRUE);
  757.                 default:
  758.                     return(FALSE);
  759.             }
  760.     case WM_CLOSE:
  761.         DestroyWindow(hDlg);
  762.         return TRUE;
  763.     }
  764.     return FALSE;
  765. }
  766.  
  767.